home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Topik / Topik - Disk 24 - Productivity (19xx)(Topik Public Domain)(PD)[WB].zip / Topik - Disk 24 - Productivity (19xx)(Topik Public Domain)(PD)[WB].adf / Calendar / user.c < prev   
C/C++ Source or Header  |  1990-01-31  |  10KB  |  637 lines

  1. /* user.c */
  2.  
  3. #include "month.h"
  4.  
  5. extern short crow, ccol, current_area, month, day, year, edit_flag;
  6. extern short this_month, this_day, this_year, message_line_filled, days;
  7. extern struct event_rec current_event;
  8. extern struct mdate mdates[];
  9. struct mdate mdates[12];
  10.  
  11. user()
  12. {
  13.     register short ch;
  14.     short n, m, y;
  15.     char *prompt;
  16.     struct mdate tmp;
  17.  
  18.     if (get_daily_events(0)) {
  19.         sound_bell();
  20.         mvaddstr(0, 0, "event today");
  21.     }
  22.  
  23.     for (;;) {
  24. MR:             move(crow, ccol);
  25.         refresh();
  26.  
  27.         m = month; y = year;
  28. GETCH:
  29.         ch = get_char();
  30.  
  31.  
  32.         switch(ch) {
  33.         case '/':
  34.             date_search();
  35.             break;
  36.  
  37.         case ';':
  38.             if (current_area != SCHEDULE) {
  39.                 goto_this_day(mdates[10].month, 1, mdates[10].year);
  40.                 tmp = mdates[10];
  41.                 mdates[10] = mdates[11];
  42.                 mdates[11] = tmp;
  43.                 goto MR;
  44.                 }
  45.             break;
  46.  
  47.         case 'q':
  48.         case 'Q':
  49.             if (current_area != SCHEDULE) {
  50.                 terminate();
  51.             }
  52.             break;
  53.  
  54.         case '\003':
  55.             /*printf("Aborted -- No update");*/
  56.             endwin();
  57.             exit(1);
  58.             break;
  59.  
  60.         case '\033':
  61.             if (edit_flag) {
  62.                 return(CANCEL);
  63.             }
  64.  
  65.         case 'L':
  66.             if (current_area == DAYS) {
  67.                 lunar();
  68.             } else {
  69.                 warn_day();
  70.             }
  71.             break;
  72.  
  73.         case UP_ARROW:
  74.         case DN_ARROW:
  75.         case RT_ARROW:
  76.         case LF_ARROW:
  77.         case 'j':
  78.         case 'k':
  79.         case 'l':
  80.         case 'h':
  81.         case 'y':
  82.         case 'm':
  83.         case 'd':
  84.         case '\t':
  85.             move_cursor(ch);
  86.             break;
  87.  
  88.         case 'n':
  89.         case '+':
  90.         case 'p':
  91.         case '-':
  92.             incr(ch);
  93.             break;
  94.  
  95.         case '\n':
  96.         case '\r':
  97.             if ((n = selection()) != NOTHING) {
  98.                 return(n);
  99.             }
  100.             break;
  101.  
  102.         case ' ':
  103.         case '\b':
  104.             scroll_time(ch);
  105.             break;
  106.  
  107.         case '0':
  108.         case '1':
  109.         case '2':
  110.         case '3':
  111.         case '4':
  112.         case '5':
  113.         case '6':
  114.         case '7':
  115.         case '8':
  116.         case '9':
  117.             switch(current_area) {
  118.             case DAYS:
  119.                 prompt = "day: ";
  120.                 break;
  121.             case MONTHS:
  122.                 prompt = "month: ";
  123.                 break;
  124.             case YEARS:
  125.                 prompt = "year: ";
  126.                 break;
  127.             case SCHEDULE:
  128.                 switch(ccol) {
  129.                 case SMONTH_COL:
  130.                     prompt = "month: ";
  131.                     break;
  132.                 case SDAY_COL:
  133.                     prompt = "day: ";
  134.                     break;
  135.                 case SYEAR_COL:
  136.                     prompt = "year: ";
  137.                     break;
  138.                 case NTH_COL:
  139.                     prompt = "nth: ";
  140.                     break;
  141.                 default:
  142.                     goto GETCH;
  143.                 }
  144.                 break;
  145.             default:
  146.                 goto GETCH;
  147.             }
  148.             if ((n = enter_number(ch, prompt)) >= 0) {
  149.                 do_number(n);
  150.             }
  151.             break;
  152.  
  153.         case 'P':
  154.             if (current_area != SCHEDULE) {
  155.                 post_event(month, day, year);
  156.             }
  157.             break;
  158.  
  159.         case 'a':
  160.         case 'A':
  161.             if (current_area != SCHEDULE) {
  162.                 show_all_events(month, year);
  163.             }
  164.             break;
  165.  
  166.         case 's':
  167.         case 'S':
  168.             if (current_area == DAYS) 
  169.                 scan_today_events();
  170.             else
  171.                 warn_day();
  172.             break;
  173.  
  174.         case 'E':
  175.             if (current_area != SCHEDULE) {
  176.                 scan_every_event();
  177.             }
  178.             break;
  179.  
  180.         case 'O':
  181.             if (current_area == DAYS) {
  182.                 overview();
  183.             } else {
  184.                 clear_schedule_area();
  185.                 warn_day();
  186.             }
  187.             break;
  188.  
  189.         case 'T':
  190.             if (current_area != SCHEDULE) {
  191.                 goto_this_day(this_month, this_day, this_year);
  192.             }
  193.             break;
  194.  
  195.         case 'M':
  196.         case 'G':
  197.             if (current_area != SCHEDULE) {
  198.                 mark_day((ch == 'G'));
  199.             }
  200.             break;
  201.  
  202.         default:
  203.             goto GETCH;
  204.             break;
  205.         }
  206.         if ((m != month) || (y != year)) {              /* changed months */
  207.             mdates[10] = mdates[11];
  208.             mdates[11].month = month;
  209.             mdates[11].year = year;
  210.         }
  211.     }
  212. }
  213.  
  214. enter_number(ch, prompt)
  215. short ch;
  216. char *prompt;
  217. {
  218.     char nbuf[6];
  219.     short col, first_col, i = 0;
  220.     int retval = -1;
  221.  
  222.     first_col = col = strlen(prompt);
  223.  
  224.     mvaddstr(0, 0, prompt);
  225.  
  226.     for (;;) {
  227.         if ((ch >= '0') && (ch <= '9')) {
  228.             if ((col < (first_col + 2)) ||
  229.                 (((current_area == YEARS) ||
  230.                 ((current_area == SCHEDULE)) &&
  231.                 (ccol == SYEAR_COL)) &&
  232.                 (col < (first_col + 4)))) {
  233.                 nbuf[i++] = ch;
  234.                 mvaddch(0, col++, ch);
  235.                 refresh();
  236.             }
  237.         } else if ((ch == '\n') || (ch == '\r')) {
  238.             nbuf[i] = 0;
  239.             retval = atoi(nbuf);
  240.             break;
  241.         } else if (ch == '\b') {
  242.             if (col > first_col) {
  243.                 i--; col--;
  244.                 mvaddch(0, col, ' ');
  245.                 move(0, col);
  246.                 refresh();
  247.             }
  248.         } else if (ch == '\033') {
  249.             break;
  250.         }
  251.         ch = get_char();
  252.     }
  253.     clear_message_line();
  254.     return(retval);
  255. }
  256.  
  257. do_number(n)
  258. short n;
  259. {
  260.     if (current_area == YEARS) {
  261.         if (n > 0) {
  262.             shift_years(n - year);
  263.             goto_year(year);
  264.         }
  265.     } else if (current_area == MONTHS) {
  266.         if ((n <= 12) && (n >= 1)) {
  267.             crow = TOP_MONTH_ROW + n;
  268.             selection();
  269.         }
  270.     } else if (current_area == DAYS) {
  271.         if ((n >= 1) && (n <= days)) {
  272.             goto_day(n);
  273.         }
  274.     } else if (current_area == SCHEDULE) {
  275.         switch(ccol) {
  276.         case SMONTH_COL:
  277.             if ((n >= 1) && (n <= 12)) {
  278.                 current_event.event_month = n;
  279.             }
  280.             break;
  281.         case SDAY_COL:
  282.             if ((n >= 1) && (n <= days)) {
  283.                 current_event.event_day = n;
  284.             }
  285.             break;
  286.         case SYEAR_COL:
  287.             if (n > 0) {
  288.                 current_event.event_year = n;
  289.             }
  290.             break;
  291.         case NTH_COL:
  292.                 if ((n > 0) && (n <= 53)) {
  293.                     current_event.nth = n;
  294.                     current_event.nth_is_on = 1;
  295.                     print_nth(¤t_event);
  296.                 }
  297.             break;
  298.         default:
  299.             return;
  300.         }
  301.         if (ccol != NTH_COL) {
  302.             print_date(current_event.event_month,
  303.             current_event.event_day, current_event.event_year);
  304.         }
  305.     }
  306. }
  307.  
  308. handle_event_description()
  309. {
  310.     short ch;
  311.  
  312.     for (;;) {
  313.         move(crow, ccol);
  314.         refresh();
  315.         ch = get_char();
  316.  
  317.         if ((ch >= ' ') && (ch <= '~')) {
  318.             if (ccol <= 78) {
  319.                 addch(ch);
  320.                 current_event.event_string[ccol-TIME_COL] = ch;
  321.                 ccol++;
  322.                 current_event.event_string[ccol-TIME_COL] = 0;
  323.             }
  324.         } else {
  325.             switch(ch) {
  326.             case '\n':
  327.             case '\r':
  328.             case '\t':
  329.                 schedule_move_cursor(ch);
  330.                 return;
  331.                 break;
  332.             case '\b':
  333.                 if (ccol > TIME_COL) {
  334.                     ccol--;
  335.                     mvaddch(crow, ccol, ' ');
  336.                     current_event.event_string
  337.                         [ccol-TIME_COL] = 0;
  338.                 }
  339.                 break;
  340.             case '\004':
  341.             case '\025':
  342.             case '\030':
  343.                 current_event.event_string[0] = 0;
  344.                 ccol = TIME_COL;
  345.                 move(crow, TIME_COL);
  346.                 clrtoeol();
  347.                 break;
  348.             case '\027':
  349.                 while ((ccol > TIME_COL) && (current_event.event_string
  350.                     [--ccol - TIME_COL] == ' ')) ;
  351.                 while ((ccol > TIME_COL) && (current_event.event_string
  352.                     [(ccol - 1) - TIME_COL] != ' ')) {
  353.                     ccol--;
  354.                 }
  355.                 move(crow, ccol);
  356.                 clrtoeol();
  357.                 break;
  358.             }
  359.         }
  360.     }
  361. }
  362.  
  363. get_answer(prompt, yes_string, no_string)
  364. char *prompt, *yes_string, *no_string;
  365. {
  366.     char *s;
  367.     short retval, col;
  368.  
  369.     mvaddstr(0, 0, prompt);
  370.     refresh();
  371.  
  372.     retval = get_char();
  373.  
  374.     s = (retval == 'y') ? yes_string : no_string;
  375.     mvaddstr(0, 0, s);
  376.     col = strlen(s);
  377.  
  378.     if (edit_flag) {
  379.         addstr(" -more-");
  380.         move(0, col + 7);
  381.         blank_out(col + 7);
  382.         move(0, col + 7);
  383.         refresh();
  384.         get_char();
  385.     } else {
  386.         blank_out(col);
  387.     }
  388.     return(retval);
  389. }
  390.  
  391. get_nq()
  392. {
  393.     register ch;
  394.  
  395.     mvaddstr(0, 0, "[n,q] ");
  396.     refresh();
  397.  
  398.     for (;;) {
  399.         ch = get_char();
  400.  
  401.         switch(ch) {
  402.         case 'q':
  403.         case '\033':
  404.             clear_message_line();
  405.             return('q');
  406.             break;
  407.         case 'n':
  408.         case '\n':
  409.         case '\r':
  410.             clear_message_line();
  411.             return('n');
  412.             break;
  413.         }
  414.     }
  415. }
  416.  
  417. get_npdeq()
  418. {
  419.     register ch;
  420.  
  421.     mvaddstr(0, 0, "[n,p,d,e,q] ");
  422.     refresh();
  423.  
  424.     for (;;) {
  425.         ch = get_char();
  426.  
  427.         switch(ch) {
  428.         case '\n':
  429.         case '\r':
  430.             ch = 'n';               /* no break statement */
  431.         case 'n':
  432.         case 'p':
  433.         case 'e':
  434.         case '\033':
  435.         case 'q':
  436.             clear_message_line();
  437.             return(ch);
  438.             break;
  439.         case 'd':
  440.             ch = get_answer("really delete? ", "", "");
  441.             if (ch == 'y') {
  442.                 mvaddstr(0, 0, "deleted");
  443.             } else {
  444.                 mvaddstr(0, 0, "not deleted");
  445.             }
  446.             addstr(" -more-");
  447.             refresh();
  448.             get_char();
  449.             clear_message_line();
  450.             return((ch == 'y') ? 'd' : '\0');
  451.             break;
  452.         }
  453.     }
  454. }
  455.  
  456. mark_day(goto_flag)
  457. short goto_flag;
  458. {
  459.     short ch;
  460.  
  461.     mvaddstr(0, 0, "mark: ");
  462.     refresh();
  463.  
  464.     for (;;) {
  465.         ch = get_char();
  466.  
  467.         switch(ch) {
  468.         case '0':
  469.         case '1':
  470.         case '2':
  471.         case '3':
  472.         case '4':
  473.         case '5':
  474.         case '6':
  475.         case '7':
  476.         case '8':
  477.         case '9':
  478.  
  479.             mvaddch(0, 6, ch);
  480.             refresh();
  481.             message_line_filled = 1;
  482.  
  483.             ch -= '0';
  484.  
  485.             if (goto_flag) {
  486.                 goto_this_day(mdates[ch].month, 1, mdates[ch].year);
  487.             } else {
  488.                 mdates[ch].month = month;
  489.                 mdates[ch].year =  year;
  490.             }
  491.             return;
  492.             break;
  493.         case '\033':
  494.         case '\n':
  495.         case '\r':
  496.             clear_message_line();
  497.             return;
  498.             break;
  499.         }
  500.     }
  501. }
  502.  
  503. get_char()
  504. {
  505.     register int ch;
  506. GETCH:
  507. #ifdef AMIGA
  508.     ch = ttgetc() & 0377;
  509. #else
  510.     ch = getchar() & 0377;
  511. #endif
  512.  
  513.     if (message_line_filled) {
  514.         clear_message_line();
  515.     }
  516.  
  517.     switch(ch) {
  518.     case '\014':
  519.     case '\022':
  520. #ifdef AMIGA
  521.         printf("refresh request\n");
  522. #else
  523.         wrefresh(curscr);
  524. #endif
  525.         goto GETCH;
  526.         break;
  527.     }
  528.     return(ch);
  529. }
  530.  
  531. date_search()
  532. {
  533.     register short ch;
  534.     short col, slash_count;
  535.     char buf[16];
  536.     int i = 0, m, d, y;
  537.  
  538. STARTOVER:
  539.  
  540.     mvaddstr(0, 0, "date: ");
  541.     buf[col = 0] = 0;
  542.     slash_count = 0;
  543.  
  544.     for (;;) {
  545.         refresh();
  546. GETCH:
  547.         ch = get_char();
  548.  
  549.         switch(ch) {
  550.         case '\b':
  551.             if (col > 0) {
  552.                 if (buf[col - 1] == '/') {
  553.                     slash_count--;
  554.                 }
  555.                 buf[--col] = 0;
  556.                 mvaddch(0, col + 6, ' ');
  557.                 move(0, col + 6);
  558.             }
  559.             break;
  560.         case '/':
  561.             if ((slash_count >= 2) || ((col > 0) && (buf[col-1] == '/')) ||
  562.                 (col == 0)) {
  563.                 sound_bell();
  564.             } else {
  565.                 addch(ch);
  566.                 buf[col++] = ch;
  567.                 buf[col] = 0;
  568.                 slash_count++;
  569.             }
  570.             break;
  571.         case '0':
  572.             if ((col == 0) || (buf[col-1] == '/')) {
  573.                 goto GETCH;
  574.             }                                       /* no break statement */
  575.         case '1':
  576.         case '2':
  577.         case '3':
  578.         case '4':
  579.         case '5':
  580.         case '6':
  581.         case '7':
  582.         case '8':
  583.         case '9':
  584.             if (
  585.             ((col == 2) && (buf[col-1] != '/')) ||
  586.             ((slash_count == 1)&&(buf[col-1] != '/')&&(buf[col-2] != '/'))||
  587.             ((slash_count == 2)&&(buf[col-1] != '/')&&(buf[col-2] != '/') &&
  588.                 (buf[col-3] != '/') && (buf[col-4] != '/')) ||
  589.             ((col == 1) && ((ch > '2') || (buf[0] > '1')))
  590.             ) {
  591.                 sound_bell();
  592.                 goto GETCH;
  593.             } else {
  594.                 addch(ch);
  595.                 buf[col++] = ch;
  596.                 buf[col] = 0;
  597.             }
  598.             break;
  599.         case '\n':
  600.         case '\r':
  601.             if ((slash_count < 2) || (buf[col-1] == '/')) {
  602.                 sound_bell();
  603.                 goto GETCH;
  604.             } else {
  605.                 sscanf(buf, "%d/%d/%d", &m, &d, &y);
  606.                 if (y < 100) {
  607.                     y += 1900;
  608.                 }
  609.                 goto_this_day(m, d, y); /* no break statement! */
  610.             }
  611.         case '\033':
  612.             goto RET;
  613.             break;
  614.         case '\004':
  615.         case '\025':
  616.         case '\030':
  617.             clear_message_line();
  618.             goto STARTOVER;
  619.             break;
  620.         default:
  621.             goto GETCH;
  622.             break;
  623.         }
  624.     }
  625. RET:
  626.     clear_message_line();
  627. }
  628.  
  629. warn_day()
  630. {
  631.     mvaddstr(0, 0, "put cursor on day-more-");
  632.     refresh();
  633.     sound_bell();
  634.     get_char();
  635.     clear_message_line();
  636. }
  637.